home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / diskdup / option.c < prev    next >
Text File  |  1993-07-08  |  9KB  |  367 lines

  1. /************************************************************
  2. *                                                            *
  3. *                        DISKDUP                             *
  4. *                                                            *
  5. *                オンメモリ型 DISKCOPY                       *
  6. *                                                            *
  7. *                        OPTION.C                            *
  8. *                                                            *
  9. ************************************************************/
  10.  
  11.  
  12.  
  13. /************************************************************
  14.  
  15.                 インクル-ドファイル
  16.  
  17. *************************************************************/
  18.  
  19. #define __OPT__
  20.  
  21.  
  22. #include <io.h>
  23. #include <fcntl.h>
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <dos.h>
  27. #include <stat.h>
  28. #include <string.h>
  29. #include <memory.h>
  30.  
  31. #include "option.h"
  32. #include "ddupgui.h"
  33. #include "diskdup.h"
  34.  
  35.  
  36. unsigned long pan;
  37. /*char fname[256];*/
  38. /*char DiskData[100000];*/
  39. /*unsigned long dtlong;*/
  40. /*char Headdata[32];*/
  41. unsigned long dtlong;
  42.  
  43.  
  44. /************************************************************
  45. [オプション解析]
  46.  
  47.         概要   オプションパラメ-タの解析を行い結果を返す
  48.         用法   optionset( argc, argv );
  49.         引数    int    argc
  50.                 char *argv[]
  51.         戻り値     0        オプション無し
  52.                 -1        オプションの指定が正しくない
  53.                 -2        ヘルプを表示
  54.                 ビットが立っていない場合 / 立っている場合
  55.                 bit 0    デ-タファイルをロ-ドしない/デ-タファイルをロ-ドする
  56.                     1    デ-タファイルを作成しない/デ-タファイルを作成する
  57.                     2*    フォ-マットを選択する    /フォ-マットをしない
  58.                     3*     フォ-マットを選択する    /フォ-マットをする
  59.                     4    入力を求める        /エラ-時以外は入力を求めない
  60.  
  61.         注意    bit2=0 && bit3=0 の時のみフォ-マットを選択する        
  62. ************************************************************/
  63. int optionset( int argc, char *argv[] )
  64.  
  65. {
  66.     int        ret;
  67.     int        count;
  68.     char    c;
  69.     ret=0;
  70.  
  71.     
  72.     /* オプション パラメータ 解析 */
  73.     if ( argc > 1 ) 
  74.         {
  75.         for ( count = 1; count < argc; count++ )     /* パラメータ の数だけ ループ */          {
  76.          if ( ( ret != -1 ) && (ret != -2 ) )
  77.             {
  78.             c = *argv[count];                        /* 先頭文字 get */
  79. /*            strcpy    ( str, argv[count] );
  80.             putmessage();
  81.             ready();*/
  82.             if ( c == '/' || c == '-' )              /* 先頭文字は '/' or '-'*/
  83.                 {
  84.                 c = *(argv[count] + 1);                /* 2 文字目 get */
  85.                 switch ( c ) 
  86.                     {
  87.                     case 'h':
  88.                     case 'H':
  89.                     case '?':
  90.                         ret = -2;
  91.                         break;
  92.  
  93.                     case 'l':
  94.                     case 'L':
  95.                         flagld=1;
  96.                         ret |= 1;
  97.                         break;
  98.  
  99.                     case 's':
  100.                     case 'S':
  101.                         flagsv=1;
  102.                         ret |= 2;
  103.                         break;
  104.  
  105.                     case 'f':
  106.                     case 'F':
  107.                         flagfmt=2;
  108.                            ret |=8;
  109.                         break;
  110.  
  111.                     case 'd':
  112.                     case 'D':
  113.                            flagfmt=1;
  114.                            ret |= 4;
  115.                            break;
  116.                            
  117.                        case 'i':
  118.                        case 'I':
  119.                            flagipt=1;
  120.                            ret |=16;
  121.                            break;
  122.                                                 
  123.                     /* 無効 パラメータ */
  124.                     default:
  125.                     ret = -1;
  126.                     }        /* <switch> */
  127.                 }            
  128.             else 
  129.                 {
  130.                    strcpy(fname, argv[count] );
  131.                /* strcpy( str, fname );
  132.                 putmessage();*/
  133.                    }            /* <if ( c=='/' || c=='-' )> */
  134.              }            /* <if (ret == -1 )> */
  135.          }    /* <for> */
  136.         }        /* <if (argc > 1 )> */
  137.     return ret;
  138. }
  139.  
  140. /***************************************************************
  141. [デ-タファイルを読み込む]
  142.         用法    loaddata();
  143.         引数    DiskData
  144.         戻り値    :0        成功
  145.                 :-1        失敗
  146.                 :1,2,3  diskのフォ-マットの種類
  147. ***************************************************************/
  148.  
  149. int loaddata ( char *Data )
  150. {
  151.     int ret;
  152.     ret=0;
  153.     int rsize;
  154.     if (access(fname,0) !=0 )
  155.         {
  156.            flagerr=1;
  157.         strcpy( str, "デ-タファイルが見つかりません。" );
  158.         putmessage();
  159.         ready();
  160.         ret=-1;
  161.            flagerr=0;
  162.         }
  163.     else
  164.         {
  165.         pan=_open(fname,_O_BINARY | _O_RDWR );
  166.         if ( pan == -1 )
  167.             {
  168.                flagerr=1;
  169.             strcpy( str, "ファイルのオ-プンに失敗しました。" );
  170.             putmessage();
  171.             ready();
  172.             ret=-1;
  173.                flagerr=0;
  174.             }
  175.             rsize = _read(pan,Headdata,32);
  176.             if( rsize == -1 || rsize != 32 )
  177.                 {
  178.                 flagerr=1;
  179.                 strcpy( str, "ヘッダの読み込みに失敗しました。" );
  180.                 putmessage();
  181.                 ready();
  182.                 _close(pan);
  183.                 ret=-1;
  184.                    flagerr=0;
  185.                 }
  186.             if( strncmp(Headdata,"DISKDUP ",8) !=0 )
  187.                 {
  188.                 flagerr=1;
  189.                 strcpy( str, "DISKDUPのデ-タファイルではありません。" );
  190.                 putmessage();
  191.                 ready();
  192.                 _close(pan);
  193.                 ret=-1;
  194.                    flagerr=0;
  195.                 }
  196.             else
  197.                 {
  198.                 ret=gethead();
  199.                 rsize = _read(pan,Data,dtlong);
  200.                 if( rsize == -1 || rsize != dtlong || ret == -1 )
  201.                     {
  202.                     flagerr=1;
  203.                     _close(pan);
  204.                     strcpy( str, "デ-タファイルの読み込みに失敗しました。" );
  205.                     putmessage();
  206.                     ready();
  207.                     ret=-1;
  208.                        flagerr=0;
  209.                     }
  210.                   else 
  211.                     {
  212.                     _close(pan);    
  213.                     }
  214.                 }
  215.         }
  216. return ret;
  217. }
  218. /***************************************************************
  219. [デ-タファイルを作成する]
  220.         用法    savedata();
  221.         引数    無し
  222.         戻り値    :0        成功
  223.                 :-1        失敗
  224. ***************************************************************/
  225.  
  226. int savedata ( char *Data  )
  227. {
  228.     int    ret;
  229.     int wsize;
  230.     ret=0;
  231.     if (_access(fname,0) ==0 )
  232.         {
  233.            flagerr=1;
  234.         strcpy( str, "同名のファイルがあります。上書きして良いですか。" );
  235.         putmessage();
  236.         if ( select()==1 )
  237.               {
  238.                ret=-1;
  239.                }
  240.         }
  241.        flagerr=0;
  242.     if (ret == 0 )
  243.         {
  244.         pan=_open(fname,_O_BINARY | _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE );
  245.            if (pan == -1 )
  246.             {
  247.                ret=-1;
  248.                }
  249.            if (ret == 0 )
  250.                {
  251.                makehead();
  252.                wsize =  _write(pan,Headdata,32);
  253.                if( wsize ==-1 || wsize != 32 )
  254.                    {
  255.                 flagerr=1;
  256.                    strcpy( str, "ヘッダの書き込みに失敗しました。" );
  257.                 putmessage();
  258.                 ready();
  259.                    _close(pan);
  260.                    ret=-1;
  261.                    flagerr=0;
  262.                    }
  263.                }    
  264.            if (ret == 0 )
  265.                {
  266.                wsize = _write(pan,Data,dtlong);
  267.                if( wsize == -1  || wsize != dtlong )
  268.                    {
  269.                 flagerr=1;
  270.                    strcpy( str, "デ-タの書き込みに失敗しました。" );
  271.                 putmessage();
  272.                 ready();
  273.                    _close(pan);
  274.                    _unlink(fname);
  275.                    ret=-1;
  276.                    flagerr=0;
  277.                    }
  278.                else
  279.                    { 
  280.                    _close(pan);
  281.                    }
  282.                }    
  283.         }
  284. return ret;
  285. }
  286. /**********************************************************
  287. [ヘッドデ-タを作る]
  288.         用法    makehead();
  289.         引数    無し
  290.         変化する変数    Headdata
  291. **********************************************************/
  292. void makehead ( void )
  293. {
  294.     switch ( disktype )
  295.     {
  296.     case  1:
  297.         strncpy ( Headdata,"DISKDUP MFM 2HD 1024B/S 8S 154T ",32 );
  298.         dtlong=1261568;
  299.         break;
  300.     case  2:
  301.         strncpy ( Headdata,"DISKDUP MFM 2DD  720B/S 9S 160T ",32 );
  302.         dtlong=737280;
  303.         break;
  304.     case  3:
  305.         strncpy ( Headdata,"DISKDUP MFM 2DD  640B/S 8S 160T ",32 );
  306.         dtlong=655360;
  307.         break;
  308.     default:
  309.         strncpy ( Headdata,"DISKDUP MFM 2HD 1024B/S 8S 154T ",32 );
  310.         dtlong=1261568;
  311.         break;
  312.     }
  313. }    
  314. /**********************************************************
  315. [ヘッドデ-タからディスクタイプを得る]
  316.         用法    gethead();
  317.         引数    無し
  318.         戻り値    0:    エラ-
  319.                 1:    2HD 1.2M
  320.                 2:    2DD 720K
  321.                 3:     2DD 640K
  322. **********************************************************/
  323. int gethead ( void )
  324. {
  325. int disktypes;
  326.     disktypes=0;
  327.     if ( strncmp(Headdata, "DISKDUP MFM 2HD 1024B/S 8S 154T ",32 ) == 0 )
  328.         {
  329.         disktypes=1;
  330.         dtlong=1261568;
  331.         flagerr=1;
  332.         strcpy( str, " 2HD  1.2M " );
  333.         putmessage();
  334.         flagerr=0;
  335.         }
  336.     else
  337.         {
  338.         if ( strncmp(Headdata, "DISKDUP MFM 2DD  720B/S 9S 160T ",32 ) == 0 )
  339.             {
  340.             disktypes=2;
  341.             dtlong=737280;
  342.             flagerr=1;
  343.             strcpy( str, " 720K  2DD " );
  344.             putmessage();
  345.             flagerr=0;
  346.             }
  347.         else
  348.             {    
  349.             if (strncmp(Headdata,"DISKDUP MFM 2DD  640B/S 8S 160T ",32 ) == 0 )
  350.                 {
  351.                 disktypes=3;
  352.                 dtlong=655360;    
  353.                 flagerr=1;
  354.                 strcpy( str, "640K  2DD " );
  355.                 putmessage();
  356.                 flagerr=0;
  357.                 }
  358.             else
  359.                 {
  360.                 disktypes=-1;
  361.                 }
  362.             }
  363.         }
  364. return disktypes;
  365. }
  366. /* END OF FILE */
  367.